home *** CD-ROM | disk | FTP | other *** search
/ Enter 2006 September / Enter 09 2006.iso / Internet / SpamExperts Home 1.1 / SpamExperts Home.exe / lib / spamexperts.modules / ZODB / fsIndex.pyc (.txt) < prev    next >
Encoding:
Python Compiled Bytecode  |  2006-07-14  |  5.0 KB  |  182 lines

  1. # Source Generated with Decompyle++
  2. # File: in.pyc (Python 2.4)
  3.  
  4. '''Implement an OID to File-position (long integer) mapping.'''
  5. import struct
  6. from BTrees._fsBTree import fsBucket
  7. from BTrees.OOBTree import OOBTree
  8.  
  9. def num2str(n):
  10.     return struct.pack('>Q', n)[2:]
  11.  
  12.  
  13. def str2num(s):
  14.     return struct.unpack('>Q', '\x00\x00' + s)[0]
  15.  
  16.  
  17. def prefix_plus_one(s):
  18.     num = str2num(s)
  19.     return num2str(num + 1)
  20.  
  21.  
  22. def prefix_minus_one(s):
  23.     num = str2num(s)
  24.     return num2str(num - 1)
  25.  
  26.  
  27. class fsIndex(object):
  28.     
  29.     def __init__(self):
  30.         self._data = OOBTree()
  31.  
  32.     
  33.     def __getitem__(self, key):
  34.         return str2num(self._data[key[:6]][key[6:]])
  35.  
  36.     
  37.     def get(self, key, default = None):
  38.         tree = self._data.get(key[:6], default)
  39.         if tree is default:
  40.             return default
  41.         
  42.         v = tree.get(key[6:], default)
  43.         if v is default:
  44.             return default
  45.         
  46.         return str2num(v)
  47.  
  48.     
  49.     def __setitem__(self, key, value):
  50.         value = num2str(value)
  51.         treekey = key[:6]
  52.         tree = self._data.get(treekey)
  53.         if tree is None:
  54.             tree = fsBucket()
  55.             self._data[treekey] = tree
  56.         
  57.         tree[key[6:]] = value
  58.  
  59.     
  60.     def __len__(self):
  61.         r = 0
  62.         for tree in self._data.itervalues():
  63.             r += len(tree)
  64.         
  65.         return r
  66.  
  67.     
  68.     def update(self, mapping):
  69.         for k, v in mapping.items():
  70.             self[k] = v
  71.         
  72.  
  73.     
  74.     def has_key(self, key):
  75.         v = self.get(key, self)
  76.         return v is not self
  77.  
  78.     
  79.     def __contains__(self, key):
  80.         tree = self._data.get(key[:6])
  81.         if tree is None:
  82.             return False
  83.         
  84.         v = tree.get(key[6:], None)
  85.         if v is None:
  86.             return False
  87.         
  88.         return True
  89.  
  90.     
  91.     def clear(self):
  92.         self._data.clear()
  93.  
  94.     
  95.     def __iter__(self):
  96.         for prefix, tree in self._data.iteritems():
  97.             for suffix in tree:
  98.                 yield prefix + suffix
  99.             
  100.         
  101.  
  102.     iterkeys = __iter__
  103.     
  104.     def keys(self):
  105.         return list(self.iterkeys())
  106.  
  107.     
  108.     def iteritems(self):
  109.         for prefix, tree in self._data.iteritems():
  110.             for suffix, value in tree.iteritems():
  111.                 yield (prefix + suffix, str2num(value))
  112.             
  113.         
  114.  
  115.     
  116.     def items(self):
  117.         return list(self.iteritems())
  118.  
  119.     
  120.     def itervalues(self):
  121.         for tree in self._data.itervalues():
  122.             for value in tree.itervalues():
  123.                 yield str2num(value)
  124.             
  125.         
  126.  
  127.     
  128.     def values(self):
  129.         return list(self.itervalues())
  130.  
  131.     
  132.     def minKey(self, key = None):
  133.         if key is None:
  134.             smallest_prefix = self._data.minKey()
  135.         else:
  136.             smallest_prefix = self._data.minKey(key[:6])
  137.         tree = self._data[smallest_prefix]
  138.         if not tree:
  139.             raise AssertionError
  140.         if key is None:
  141.             smallest_suffix = tree.minKey()
  142.         else:
  143.             
  144.             try:
  145.                 smallest_suffix = tree.minKey(key[6:])
  146.             except ValueError:
  147.                 next_prefix = prefix_plus_one(smallest_prefix)
  148.                 smallest_prefix = self._data.minKey(next_prefix)
  149.                 tree = self._data[smallest_prefix]
  150.                 if not tree:
  151.                     raise AssertionError
  152.                 smallest_suffix = tree.minKey()
  153.  
  154.         return smallest_prefix + smallest_suffix
  155.  
  156.     
  157.     def maxKey(self, key = None):
  158.         if key is None:
  159.             biggest_prefix = self._data.maxKey()
  160.         else:
  161.             biggest_prefix = self._data.maxKey(key[:6])
  162.         tree = self._data[biggest_prefix]
  163.         if not tree:
  164.             raise AssertionError
  165.         if key is None:
  166.             biggest_suffix = tree.maxKey()
  167.         else:
  168.             
  169.             try:
  170.                 biggest_suffix = tree.maxKey(key[6:])
  171.             except ValueError:
  172.                 next_prefix = prefix_minus_one(biggest_prefix)
  173.                 biggest_prefix = self._data.maxKey(next_prefix)
  174.                 tree = self._data[biggest_prefix]
  175.                 if not tree:
  176.                     raise AssertionError
  177.                 biggest_suffix = tree.maxKey()
  178.  
  179.         return biggest_prefix + biggest_suffix
  180.  
  181.  
  182.